//头文件，对于源文件变量的初始化（6-42行）
//以及定义了由QWidget派生出来的一个类的成员函数的声明
//变量主要包括：单个方块单元的边长BLOCK_SIZE，场景边距，内墙到主屏幕左端的距离，场景区域行数列数


#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

const int BLOCK_SIZE=25; //单个方块单元的边长
const int MARGIN=20; //场景边距
const int AREA_ROW=20; //场景行数
const int AREA_COL=20; //场景列数

//枚举变量direction包含五个方向，上、下、左、右、空白键
//分别控制左移、右移、旋转、一键到底
//方向
enum Direction
{
    UP,
    DOWN,
    LEFT,
    RIGHT,
    SPACE
};

//定义边界信息，结构体包含四个int型整数，上边界、下边界、左边界、右边界
struct Border
{
    int ubound;
    int dbound;
    int lbound;
    int rbound;
};

//坐标，定义了横坐标、纵坐标
struct block_point
{
    int pos_x;
    int pos_y;
    //    block_point(int x,int y):pos_x(x),pos_y(y){}
};

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
//下面是很多个成员函数

public:
    void InitGame(); //初始化
    //控制游戏状态——开始或者结束
    void StartGame(); //开始游戏
    void GameOver(); //游戏结束

    void ResetBlock(); //重置方块，指的是前一个方块和边界碰撞之后处于稳定
    //然后出现下一个方块
    void BlockMove(Direction dir); //方块变动，对方快调节，通过键盘控制，左右平移
    void BlockRotate(int block[4][4]); //方块旋转，按上箭头，方块逆时针旋转90°
    void CreateBlock(int block[4][4],int block_id); //产生方块，根据随机化的函数产生新的方块
    void GetBorder(int block[4][4],Border &border); //计算边界
    void ConvertStable(int x,int y); //转换为稳定方块
    bool IsCollide(int x,int y,Direction dir); //判断是否会碰撞

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    virtual void paintEvent(QPaintEvent *event); //场景刷新，方块下落的时候，场景会以一个频率发生变化
    virtual void timerEvent(QTimerEvent *event); //定时器事件
    virtual void keyPressEvent(QKeyEvent *event); //键盘事件，根据键盘控制游戏进程


private slots:


private:
    Ui::Widget *ui;

private:
    int game_area[AREA_ROW][AREA_COL]; //场景区域，1表示活动的方块，2表示稳定的方块，0表示空
    block_point block_pos; //当前方块坐标
    int cur_block[4][4]; //当前方块形状
    Border cur_border; //当前方块边界
    int next_block[4][4]; //下一个方块形状
    bool isStable; //当前方块是否稳定了
    int score;  //游戏分数
    int game_timer; //方块下落计时器
    int paint_timer; //渲染刷新计时器
    int speed_ms; //下落时间间隔
    int refresh_ms; //刷新时间间隔

};

#endif // WIDGET_H
